02.03.06 降维
我们可以对任意张量进行的一个有用的操作是计算其元素的和。
数学表示法使用符号∑
表示求和。
为了表示长度为d的向量中元素的总和,可以记为
。 在代码中可以调用计算求和的函数:
import torch
x = torch.arange(4, dtype=torch.float32)
print(x)
print(x.sum())
返回值:
tensor([0., 1., 2., 3.])
tensor(6.)
我们可以表示任意形状张量的元素和。
例如,矩阵中元素的和可以记为
。
import torch
A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
print(A)
print(A.shape)
print(A.sum())
返回值:
tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.],
[16., 17., 18., 19.]])
torch.Size([5, 4])
tensor(190.)
默认情况下,调用求和函数会沿所有的轴降低张量的维度,使它变为一个标量。 我们还可以指定张量沿哪一个轴来通过求和降低维度。 以矩阵为例,为了通过求和所有行的元素来降维(轴0),可以在调用函数时指定axis=0。 由于输入矩阵沿0轴降维以生成输出向量,因此输入轴0的维数在输出形状中消失。
import torch
A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
print(A)
A_sum_axis0 = A.sum(axis=0)
print(A_sum_axis0)
print(A_sum_axis0.shape)
返回值:
tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.],
[16., 17., 18., 19.]])
tensor([40., 45., 50., 55.])
torch.Size([4])
指定axis=1将通过汇总所有列的元素降维(轴1)。因此,输入轴1的维数在输出形状中消失。
import torch
A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
print(A)
A_sum_axis1 = A.sum(axis=1)
print(A_sum_axis1)
print(A_sum_axis1.shape)
返回值:
tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.],
[16., 17., 18., 19.]])
tensor([ 6., 22., 38., 54., 70.])
torch.Size([5])
沿着行和列对矩阵求和,等价于对矩阵的所有元素进行求和。
import torch
A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
print(A)
B=A.sum(axis=[0, 1]) # 结果和A.sum()相同
print(B)
返回值:
tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.],
[16., 17., 18., 19.]])
tensor(190.)
一个与求和相关的量是平均值(mean或average)。 我们通过将总和除以元素总数来计算平均值。 在代码中,我们可以调用函数来计算任意形状张量的平均值。
import torch
A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
print(A)
B=A.mean(), A.numel(),A.sum() / A.numel()
print(B)
返回值:
tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.],
[16., 17., 18., 19.]])
(tensor(9.5000), 20, tensor(9.5000))
同样,计算平均值的函数也可以沿指定轴降低张量的维度。
import torch
A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
print(A)
B=A.sum(axis=0), A.shape[0],A.sum(axis=0) / A.shape[0]
print(B)
返回值:
tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.],
[16., 17., 18., 19.]])
(tensor([40., 45., 50., 55.]), 5, tensor([ 8., 9., 10., 11.]))